// pages/my/my.js
const app = getApp(); // 提前获取 app 实例

Page({
  data: {
    userInfo: null,
    token: null // 可以考虑将 token 也放在 data 中，方便模板绑定（例如根据 token 显示/隐藏某些元素）
  },

  onLoad() {
    this.checkLoginStatus();
    // 监听登录成功事件
    this.bindLoginSuccessEvent();
  },

  onShow() {
    this.checkLoginStatus();
  },

  onUnload() {
    // 页面卸载时移除事件监听
    this.unbindLoginSuccessEvent();
  },

  // 绑定登录成功事件
  bindLoginSuccessEvent() {
    const eventBus = require('../../utils/eventBus');
    this.loginSuccessHandler = (userInfo) => {
      console.log('我的页面收到登录成功事件');
      this._updateUserInfo(userInfo);
      this.setData({ token: wx.getStorageSync('token') });
    };
    eventBus.on('loginSuccess', this.loginSuccessHandler);
  },

  // 解绑登录成功事件
  unbindLoginSuccessEvent() {
    if (this.loginSuccessHandler) {
      const eventBus = require('../../utils/eventBus');
      eventBus.off('loginSuccess', this.loginSuccessHandler);
    }
  },



  // 检查本地登录状态
  checkLoginStatus() {
    const storedUserInfoStr = wx.getStorageSync('userInfo');
    const token = wx.getStorageSync('token');

    if (storedUserInfoStr && token) {
      wx.checkSession({
        success: () => {
          console.log("Session 有效，使用本地缓存信息");
          try {
            const storedUserInfo = JSON.parse(storedUserInfoStr);
            // 使用辅助函数更新用户信息
            this._updateUserInfo(storedUserInfo);
            // 同时更新 token 状态 (如果需要)
            this.setData({ token: token });
            // 更新全局 token (如果 app.js 没有在 onLaunch 时做)
            app.globalData.token = token;
          } catch (e) {
            console.error("解析本地用户信息失败:", e);
            this.clearLoginInfo(); // 解析失败则清空
          }
        },
        fail: () => {
          console.log("Session 失效，清除登录信息");
          this.clearLoginInfo();
        }
      });
    } else {
      console.log("无本地登录信息");
      this.setData({ userInfo: null, token: null }); // 确保页面状态也清空
    }
  },

  // --- 核心优化：统一更新用户信息 ---
  _updateUserInfo(userInfoData) {
    if (userInfoData) {
      // 确保是对象类型
      if (typeof userInfoData !== 'object' || userInfoData === null) {
        console.error("无效的用户信息数据:", userInfoData);
        return;
      }


      // 如果已有全局用户信息，保留现有信息并更新新的字段
      const currentUserInfo = app.globalData.userInfo || {};
      const updatedUserInfo = {
        ...currentUserInfo,
        ...userInfoData
      };

      // 1. 更新页面数据
      this.setData({ userInfo: updatedUserInfo });
      // 2. 更新本地存储
      wx.setStorageSync('userInfo', JSON.stringify(updatedUserInfo));
      // 3. 更新全局数据
      app.globalData.userInfo = updatedUserInfo;

    } else {
      console.log("清除用户信息");
      // 清除用户信息
      this.setData({ userInfo: null });
      wx.removeStorageSync('userInfo');
      app.globalData.userInfo = null;
    }
  },

  // 一键登录处理
  handleLogin() {
    wx.showLoading({ title: '登录中...', mask: true });

    wx.getUserProfile({
      desc: '用于完善会员资料',
      success: (profileRes) => {
        const basicUserInfo = profileRes.userInfo; // 仅含昵称、头像等

        wx.login({
          success: (loginRes) => {
            if (loginRes.code) {
              wx.request({
                url: 'https://visa.goldenholiday.com/api/miniapp/admin/user/wxLogin', // 建议将 URL 提取为常量或配置
                method: 'POST',
                header: { 'content-type': 'application/json' },
                data: {
                  code: loginRes.code,
                  userInfo: { // 只传递必要信息给后端
                    nickName: basicUserInfo.nickName,
                    avatarUrl: basicUserInfo.avatarUrl
                  }
                },
                success: (res) => {
                  wx.hideLoading(); // 请求成功后隐藏 Loading
                  if (res.statusCode === 200 && res.data.code === 1) {
                    const backendUserInfo = res.data.data; // 后端返回的完整用户信息（含 token、userId 等）

                    // 存储 Token
                    const token = backendUserInfo.token;
                    wx.setStorageSync('token', token);
                    this.setData({ token: token });
                    app.globalData.token = token; // 更新全局 token

                    // 使用辅助函数更新用户信息
                    this._updateUserInfo(backendUserInfo);

                    // 使用事件总线通知其他页面登录成功
                    const eventBus = require('../../utils/eventBus');
                    eventBus.emit('loginSuccess', backendUserInfo);

                    // 提示用户绑定手机号（如果需要）
                    if (!backendUserInfo.phone) {
                       wx.showToast({
                        title: '登录成功，请绑定手机号',
                        icon: 'none',
                        duration: 2000
                      });
                    } else {
                       wx.showToast({ title: '登录成功', icon: 'success' });
                    }

                  } else {
                    wx.showToast({ title: res.data.msg || '登录失败', icon: 'none' });
                  }
                },
                fail: (err) => {
                  wx.hideLoading(); // 请求失败后隐藏 Loading
                  console.error('登录请求失败：', err);
                  wx.showToast({ title: '网络错误，请稍后重试', icon: 'none' });
                }
                // complete 不再需要单独 hideLoading，因为 success 和 fail 都处理了
              });
            } else {
              wx.hideLoading();
              wx.showToast({ title: '获取登录凭证失败', icon: 'none' });
            }
          },
          fail: (err) => {
            wx.hideLoading();
            console.error('wx.login 失败:', err);
            wx.showToast({ title: '微信登录调用失败', icon: 'none' });
          }
        });
      },
      fail: (err) => {
        wx.hideLoading();
        // 用户拒绝授权 getUserProfile 不一定是错误，是正常流程
        if (err.errMsg.includes('fail auth deny')) {
          console.log('用户拒绝授权用户信息');
          wx.showToast({ title: '您取消了授权', icon: 'none' });
        } else {
          console.error('获取用户信息失败:', err);
          wx.showToast({ title: '获取用户信息失败', icon: 'none' });
        }
      }
    });
  },

  // 通知其他页面登录成功
  notifyOtherPagesLoginSuccess(userInfo) {
    const pages = getCurrentPages();
    pages.forEach(page => {
      // 通知订单页面更新状态
      if (page.route.includes('order/order')) {
        if (typeof page.onLoginSuccess === 'function') {
          page.onLoginSuccess(userInfo);
        } else {
          // 如果没有专门的方法，触发onShow来刷新状态
          page.onShow();
        }
      }
    });
  },

  // 获取手机号处理函数
  getPhoneNumber(e) {
    if (e.detail.errMsg === 'getPhoneNumber:ok') {
      const { encryptedData, iv } = e.detail;
      const token = wx.getStorageSync('token');
  
      if (!token) {
        wx.showToast({ title: '请先完成登录', icon: 'none' });
        return;
      }
  
      wx.showLoading({ title: '手机号绑定中...', mask: true });
  
      wx.request({
        url: 'https://visa.goldenholiday.com/api/miniapp/admin/user/bindPhone',
        method: 'POST',
        header: {
          'content-type': 'application/json',
          'token': token
        },
        data: {
          encryptedData,
          iv
        },
        success: (res) => {
          wx.hideLoading();
          if (res.statusCode === 200 && res.data.code === 1) {
            // 获取当前的用户信息
            const currentUserInfo = app.globalData.userInfo || {};
            
            // 确保后端返回的数据中包含手机号
            if (res.data.data && res.data.data.phone) {
              // 合并现有用户信息和新的手机号
              const updatedUserInfo = {
                ...currentUserInfo,
                phone: res.data.data.phone
              };
              
              // 更新用户信息
              this._updateUserInfo(updatedUserInfo);
              
              // 通知其他页面刷新
              const pages = getCurrentPages();
              pages.forEach(page => {
                if (page.route.includes('information')) {
                  page.onShow(); // 触发页面的 onShow 方法
                }
              });
  
              wx.showToast({ title: '手机号绑定成功', icon: 'success' });
            } else {
              console.error("后端返回数据格式错误:", res.data);
              wx.showToast({ title: '绑定失败，数据格式错误', icon: 'none' });
            }
          } else {
            wx.showToast({ title: res.data.msg || '绑定失败', icon: 'none' });
          }
        },
        fail: (err) => {
          wx.hideLoading();
          console.error('绑定手机号请求失败：', err);
          wx.showToast({ title: '网络错误，请稍后重试', icon: 'none' });
        }
      });
    } else {
      console.log('用户拒绝授权手机号');
      wx.showToast({ title: '您取消了手机号授权', icon: 'none' });
    }
  },

  // 退出登录
  logout() {
    wx.showModal({
      title: '提示',
      content: '确定要退出登录吗？',
      success: (res) => {
        if (res.confirm) {
          this.clearLoginInfo();
          wx.showToast({ title: '已退出登录', icon: 'none' });
        }
      }
    });
  },

  // 清除登录信息（本地存储、页面数据、全局数据）
  clearLoginInfo() {
    // 清除 Token
    wx.removeStorageSync('token');
    this.setData({ token: null });
    app.globalData.token = null; // 清除全局 token

    // 使用辅助函数清除用户信息
    this._updateUserInfo(null);
  },

  // --- 页面跳转函数 (保持不变) ---
  // 添加一个通用的检查函数
  checkAuthStatus(needPhone = true) {
    if (!this.data.userInfo) {
      wx.showModal({
        title: '提示',
        content: '请先登录后再操作',
        confirmText: '去登录',
        success: (res) => {
          if (res.confirm) {
            this.handleLogin();
          }
        }
      });
      return false;
    }
    
    if (needPhone && !this.data.userInfo.phone) {
      wx.showModal({
        title: '提示',
        content: '请先绑定手机号后再操作',
        confirmText: '去绑定',
        cancelText: '取消',
        success: (res) => {
          if (res.confirm) {
            // 用户点击确定，显示手机号绑定提示
            wx.showToast({
              title: '请点击"绑定手机号"按钮进行绑定',
              icon: 'none',
              duration: 2000
            });
          }
        }
      });
      return false;
    }
    
    return true;
  },
  
  // 修改现有的导航函数
  navigateToMessage() {
    if (this.checkAuthStatus()) {
      wx.navigateTo({ url: '/pages/message/message' });
    }
  },
  
  navigateToAddress() {
    if (this.checkAuthStatus()) {
      wx.navigateTo({ url: '/pages/address/address' });
    }
  },
  
  navigateToExpress() {
    if (this.checkAuthStatus()) {
      wx.navigateTo({ url: '/pages/express/express' });
    }
  },

  navigateToSupport() {
    wx.navigateTo({ url: '/pages/contactSupport/contactSupport' });
  },
  
  openaboutme() {
    wx.navigateTo({ url: '/pages/aboutme/aboutme' });
  },
});